package top.lyjwn.todo.common.utils;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 数据传输整理工具
 * 
 * @author luoyujie
 *
 */
public class DtoUtil {

//	/**
//	 * 需要处理的对象
//	 */
//	private Object object;
//
//	/**
//	 * 需要置为空的属性名
//	 */
//	private String[] setToNulls;

	/**
	 * 
	 * @param object     需要处理的对象
	 * @param setToNulls 需要置为空的属性名
	 * @return
	 */
	public static Object getDisposeObject(Object object, String[] setToNulls) {

		String[] filedName = getFiledName(object);
		for (String string : filedName) {
			if (isStrings(string, setToNulls)) {
				setFieldValueByName(string, object, null);
			}
		}
		return object;
	}

	/**
	 * 判断字符串是否存在于数组中
	 * 
	 * @param string
	 * @param strs
	 * @return
	 */
	public static boolean isStrings(String string, String[] strs) {
		for (String str : strs) {
			if (str.equals(string)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 获取属性名数组
	 * 
	 * @param o
	 * @return
	 */
	private static String[] getFiledName(Object Object) {
		Field[] fields = Object.getClass().getDeclaredFields();
		String[] fieldNames = new String[fields.length];
		for (int i = 0; i < fields.length; i++) {
			fieldNames[i] = fields[i].getName();
		}
		return fieldNames;
	}

	/**
	 * 根据属性名获取属性值
	 * 
	 * @param fieldName
	 * @param o
	 * @return
	 */
	@SuppressWarnings("unused")
	private static Object getFieldValueByName(String fieldName, Object object) {
		try {
			PropertyDescriptor pd = new PropertyDescriptor(fieldName, object.getClass());
			Method getMethod = pd.getReadMethod();
			Object value = getMethod.invoke(object, new Object[] {});
			return value;
		} catch (Exception e) {

			return null;
		}
	}

	/**
	 * 调用set方法写入值
	 * 
	 * @param fieldName 属性名
	 * @param object    调用对象
	 * @param setObj    要写入的值
	 */
	private static void setFieldValueByName(String fieldName, Object object, Object setObj) {
		// 此处应该判断beanObj,property不为null
		try {
			PropertyDescriptor pd = new PropertyDescriptor(fieldName, object.getClass());
			Method setMethod = pd.getWriteMethod();
			setMethod.invoke(object, setObj);
		} catch (IntrospectionException | IllegalAccessException | IllegalArgumentException
				| InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
